package com.oneinlet

import java.lang.RuntimeException
import java.util.concurrent.ThreadLocalRandom

/**
 * Created by WangZiHe on 2018/5/13
 * QQ/WeChat:648830605
 * QQ-Group:368512253
 * Blog:www.520code.net
 * Github:https://github.com/yancheng199287
 */

/**
 * 字符串帮手，帮助你人性化简单处理各种字符串的拼接,移位，统计，金钱分割，百分号格式化,随机字符串
 * 注意 empty是指null或者""空字符串  blank是指空格
 * @see java.lang.String
 * @author  WangZihe
 */
object YCString {

    /**
     * 判断字符串是null或者空字符串""
     * @param num  接收一个字符串
     * @return  布尔值
     * */
    fun isEmpty(str: Any?): Boolean {
        return str == null || "" == str
    }

    /**
     * 判断字符串是null或者空字符串""
     * @param num  接收一个字符串
     * @return  布尔值
     * */
    fun isNotEmpty(str: Any?): Boolean {
        return str != null && "" != str
    }


    /**
     * 判断数组字符串 不是null或者非空字符串""，如果存在一个为空则立即返回false
     * @param str  接收一个字符串数组，使用可变参数
     * @return  布尔值
     * */
    fun isNotEmptyArray(vararg str: Any?): Boolean {
        for (s in str) {
            if (isEmpty(s)) {
                return false
            }
        }
        return true
    }

    /**
     * 判断数组字符串是null或者空字符串""，如果存在一个为空则立即返回false
     * @param str  接收一个字符串数组，使用可变参数
     * @return  布尔值
     * */
    fun isEmptyArray(vararg str: Any?): Boolean {
        for (s in str) {
            if (isNotEmpty(s)) {
                return false
            }
        }
        return true
    }

    /**
     * 判断字符串是否包含文本内容，空格不算
     * @param num  接收一个字符串
     * @return  布尔值
     * */
    fun hasText(str: String?): Boolean {
        if (!hasLength(str)) {
            return false
        } else {
            val strLen = str!!.length
            for (i in 0 until strLen) {
                if (!Character.isWhitespace(str[i])) {
                    return true
                }
            }
            return false
        }
    }

    /**
     * 判断字符串长度是否有效，即不为null且大于0
     * @param num  接收一个字符串
     * @return  布尔值
     * */
    fun hasLength(str: String?): Boolean {
        return str != null && str.isNotEmpty()
    }


    /**
     * 生成随机数,只能是0-9数字
     * @param num  接收一个整型值，表示生成多少数量
     * @return  返回一个指定数量的随机数字字符串
     * */
    fun generateRandomNum(count: Int): String {
        val num = "0123456789"
        val stringBuilder = StringBuilder(count)
        for (i in 1..count) {
            val index = Math.random() * 10
            stringBuilder.append(num[index.toInt()])
        }
        return stringBuilder.toString()
    }

    /**
     * 生成随机数,只能是0-9数字和大小写26个字母 共计62个字符
     * @param num  接收一个整型值，表示生成多少数量
     * @return  返回一个指定数量的随机字符串
     * */
    fun generateRandomChar(count: Int): String {
        val letter = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
        val stringBuilder = StringBuilder(count)
        for (i in 1..count) {
            val index = Math.random() * 62
            stringBuilder.append(letter[index.toInt()])
        }
        return stringBuilder.toString()
    }

    /**
     * 生成随机数,大小写字母52
     * @param num  接收一个整型值，表示生成多少数量
     * @return  返回一个指定数量的随机字符串
     * */
    fun generateRandomLetter(count: Int): String {
        val letter = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
        val stringBuilder = StringBuilder(count)
        for (i in 1..count) {
            val index = Math.random() * 52
            stringBuilder.append(letter[index.toInt()])
        }
        return stringBuilder.toString()
    }

    /**
     * 生成区间随机数，该随机数在该区间范围内，两边均闭合状态
     * @param min  起始值
     *  @param max  终点值
     * @return  返回一个指定数量的随机字符串
     * */
    fun generateRandomIntervalNum(min: Int, max: Int): Int {
        if (min >= max) {
            throw RuntimeException("max值必须大于min的值")
        }
        //JDK自带方法 线程安全
        return ThreadLocalRandom.current().nextInt(min, max + 1)
    }


    /**
     *  打印bean的所有属性 键值对
     * @param any  接收一个任意对象
     * @return  返回对象的所有属性和值的字符串
     * */
    fun toString(any: Any): String {
        val sb = StringBuilder()
        YCReflect.getPropertyValue(any).entries.forEach {
            sb.append(it.key).append("=").append(it.value).append(",")
        }
        return sb.toString()
    }

    /**
     *  为数组添加分隔符 末尾不带分割符号
     * @param delimiter  分隔符
     * @param args  待分割的数组内容
     * @return  返回已经分割好的字符串，最后末尾不带分隔符
     * */
    fun join(delimiter: String, vararg args: String): String {
        val len = args.size
        val sb = java.lang.StringBuilder()
        for (i in 0 until len - 1) {
            sb.append(args[i]).append(delimiter)
        }
        sb.append(args[len - 1])
        return sb.toString()
    }

}
